home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / msn / MSNCommands.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  14KB  |  423 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import logging
  5. import msn
  6. from rfc822 import Message as RfcMsg
  7. from util import pythonize, Storage, isint, get, autoassign, fuzzydecode
  8.  
  9. class CommandProcessor(object):
  10.     
  11.     def __init__(self, log):
  12.         if not log:
  13.             pass
  14.         self.log = logging.getLogger(type(self).__name__)
  15.         self.process_cmd = Storage(success = self.on_message, error = self.on_error)
  16.  
  17.     
  18.     def on_message(self, msg):
  19.         if self.log:
  20.             self.log.log_s(1, 'Got message: %r', str(msg)[:100].strip('\r\n'))
  21.         
  22.         mname = 'recv_%s' % pythonize(msg.cmd)
  23.         getattr(self, mname, self.unknown_cmd)(msg)
  24.  
  25.     
  26.     def on_error(self, msg):
  27.         self.log.error('MSNError! %r', msg)
  28.  
  29.     
  30.     def unknown_cmd(self, msg):
  31.         self.log.warning('Received unknown message from transport. Message is <%r>', msg)
  32.  
  33.  
  34.  
  35. class MsgPayload(RfcMsg):
  36.     
  37.     def __len__(self):
  38.         return len(self.body())
  39.  
  40.  
  41.  
  42. class Message(object):
  43.     argnames = []
  44.     
  45.     def __init__(self, cmd, *args, **kws):
  46.         self.cmd = cmd.upper()
  47.         self.args = args
  48.         self.trid = int(kws.pop('trid', 0))
  49.         if not kws.pop('payload', None):
  50.             pass
  51.         self.payload = None
  52.  
  53.     
  54.     def length(self):
  55.         if self.is_payload:
  56.             return len(str(self.payload))
  57.         else:
  58.             return 0
  59.  
  60.     length = property(length)
  61.     
  62.     def is_trid(self):
  63.         if isint(self.trid):
  64.             pass
  65.         return bool(int(self.trid))
  66.  
  67.     is_trid = property(is_trid)
  68.     
  69.     def is_payload(self):
  70.         return self.payload is not None
  71.  
  72.     is_payload = property(is_payload)
  73.     
  74.     def is_error(self):
  75.         return bool(self.error_code)
  76.  
  77.     is_error = property(is_error)
  78.     
  79.     def error_str(self):
  80.         return msn.error_codes.get(self.error_code, 'Undocumented error')
  81.  
  82.     error_str = property(error_str)
  83.     
  84.     def error_code(self):
  85.         
  86.         try:
  87.             return int(self.cmd)
  88.         except:
  89.             return None
  90.  
  91.  
  92.     error_code = property(error_code)
  93.     
  94.     def __iter__(self):
  95.         return iter(self.args)
  96.  
  97.     
  98.     def __str__(self):
  99.         res = [
  100.             self.cmd]
  101.         if self.is_trid:
  102.             res.append(str(self.trid))
  103.         
  104.         res.extend(map(str, self.args))
  105.         if self.is_payload:
  106.             res.append(str(self.length) + '\r\n' + str(self.payload))
  107.         
  108.         return None + ' '.join(res) if not self.is_payload else ''
  109.  
  110.     
  111.     def __repr__(self):
  112.         err_str = None if self.is_error else ''
  113.         if type(self) is Message:
  114.             typestr = Message.__name__
  115.         else:
  116.             typestr = '%s(%s)' % (Message.__name__, type(self).__name__)
  117.         return None % ('<%s %s trid=%s, %sargs=%r, len(payload)=%s>', typestr, self.cmd, self.trid, err_str, self.args if self.is_payload else None)
  118.  
  119.     
  120.     def __getattr__(self, attr):
  121.         if attr in self.argnames:
  122.             return self.args[self.argnames.index(attr)]
  123.         else:
  124.             return object.__getattribute__(self, attr)
  125.  
  126.     
  127.     def get(self, key, default = sentinel):
  128.         
  129.         try:
  130.             return self[key]
  131.         except KeyError:
  132.             if default is sentinel:
  133.                 raise 
  134.             else:
  135.                 return default
  136.         except:
  137.             default is sentinel
  138.  
  139.  
  140.     
  141.     def __getitem__(self, *a):
  142.         return self.args.__getitem__(*a)
  143.  
  144.     
  145.     def from_net(cls, data, is_payload):
  146.         if is_payload:
  147.             (cmdline, payload) = data.split('\r\n', 1)
  148.         else:
  149.             cmdline = data
  150.             payload = None
  151.         cmdline = cmdline.strip('\r\n ')
  152.         dlist = cmdline.split(' ')
  153.         cmd = dlist.pop(0)
  154.         if dlist and isint(dlist[0]):
  155.             trid = int(dlist.pop(0))
  156.         else:
  157.             trid = 0
  158.         if is_payload:
  159.             
  160.             try:
  161.                 l = dlist.pop()
  162.             except IndexError:
  163.                 l = trid
  164.                 trid = 0
  165.  
  166.             
  167.             try:
  168.                 pass
  169.             except AssertionError:
  170.                 dlist.append(l)
  171.                 if not payload.strip():
  172.                     pass
  173.                 payload = None
  174.             except:
  175.                 None<EXCEPTION MATCH>AssertionError
  176.             
  177.  
  178.         None<EXCEPTION MATCH>AssertionError
  179.         args = tuple(dlist)
  180.         if cmd == 'MSG':
  181.             subcmd = msn.util.msgtypes.get(MsgPayload(payload)['content-type'].split(';')[0], '')
  182.             cls = globals().get(cmd + subcmd, MSG)
  183.         else:
  184.             cls = globals().get(cmd, cls)
  185.         return cls(cmd, trid = trid, payload = payload, *args)
  186.  
  187.     from_net = classmethod(from_net)
  188.  
  189.  
  190. class OUT(Message):
  191.     argnames = [
  192.         'reason']
  193.  
  194.  
  195. class MSG(Message):
  196.     argnames = 'name nick length'.split()
  197.     
  198.     def __init__(self, *a, **k):
  199.         if a[0] != 'MSG':
  200.             a = ('MSG',) + a
  201.         
  202.         Message.__init__(self, *a, **k)
  203.         self.type = msn.util.msgtypes.setdefault(self.payload['content-type'].split(';')[0], 'unknown')
  204.  
  205.     
  206.     def __getitem__(self, *a, **k):
  207.         
  208.         try:
  209.             return Message.__getitem__(self, *a, **k)
  210.         except:
  211.             return self.payload.__getitem__(*a, **k)
  212.  
  213.  
  214.     
  215.     def _get_payload(self):
  216.         return self._payload
  217.  
  218.     
  219.     def _set_payload(self, payload):
  220.         self._payload = MsgPayload(payload)
  221.  
  222.     payload = property(_get_payload, _set_payload)
  223.     
  224.     def from_net(self, data, is_payload):
  225.         data = data[4:]
  226.         return Message.from_net(data, is_payload)
  227.  
  228.     
  229.     def __repr__(self):
  230.         super = Message.__repr__(self)
  231.         return '%s type=%s>' % (super.rstrip('>'), self.type)
  232.  
  233.  
  234.  
  235. class MSGdatacast(MSG):
  236.     
  237.     def _get_payload(self):
  238.         return MSG._get_payload(self)
  239.  
  240.     
  241.     def _set_payload(self, payload):
  242.         MSG._set_payload(self, payload)
  243.         self.contents = MsgPayload(self.payload.body())
  244.  
  245.     payload = property(_get_payload, _set_payload)
  246.     
  247.     def __getattr__(self, attr):
  248.         if attr in ('id', 'data'):
  249.             return get(self.contents, attr)
  250.         else:
  251.             return MSG.__getattr__(self, attr)
  252.  
  253.  
  254.  
  255. class UBM(Message):
  256.     
  257.     def __init__(self, *a, **k):
  258.         Message.__init__(self, *a, **k)
  259.         self.type = msn.util.msgtypes.setdefault(self.payload['content-type'].split(';')[0], 'unknown')
  260.  
  261.     
  262.     def _get_payload(self):
  263.         return self._payload
  264.  
  265.     
  266.     def _set_payload(self, payload):
  267.         self._payload = MsgPayload(payload)
  268.  
  269.     payload = property(_get_payload, _set_payload)
  270.     
  271.     def __getitem__(self, *a, **k):
  272.         
  273.         try:
  274.             return Message.__getitem__(self, *a, **k)
  275.         except:
  276.             return self.payload.__getitem__(*a, **k)
  277.  
  278.  
  279.  
  280.  
  281. class MSNSB_Message(Message):
  282.     
  283.     def __init__(self, contenttype, body, acktype = 'N', headers = { }, **moreheaders):
  284.         moreheaders.update(headers)
  285.         content = []
  286.         content.append('MIME-Version: 1.0')
  287.         content.append('Content-Type: text/x-%s' % contenttype)
  288.         for header in moreheaders.items():
  289.             content.append('%s: %s' % header)
  290.         
  291.         content.append('')
  292.         payload = '\r\n'.join(content) + body
  293.         Message.__init__(self, 'MSG', acktype, payload = payload)
  294.  
  295.  
  296.  
  297. class MSNTextMessage(object):
  298.     
  299.     def __init__(self, body, fontname = None, color = None, rightalign = False, bold = False, italic = False, underline = False, strike = False, charset = 0, family = 22):
  300.         autoassign(self, locals())
  301.         if isinstance(self.fontname, str):
  302.             self.fontname = self.fontname.decode('fuzzy utf8')
  303.         
  304.         if isinstance(self.body, str):
  305.             self.body = self.body.decode('fuzzy utf8')
  306.         
  307.         self.effects = ''
  308.         if self.bold:
  309.             self.effects += 'B'
  310.         
  311.         if self.italic:
  312.             self.effects += 'I'
  313.         
  314.         if self.underline:
  315.             self.effects += 'U'
  316.         
  317.         if self.strike:
  318.             self.effects += 'S'
  319.         
  320.         if self.color is not None:
  321.             (self.r, self.g, self.b) = self.color[:3]
  322.         else:
  323.             self.r = None
  324.             self.g = None
  325.             self.b = None
  326.         self._MSNTextMessage__html = u''
  327.  
  328.     
  329.     def __str__(self):
  330.         s = None([
  331.             None,
  332.             None,
  333.             u'\r\n'.join + 'MIME-Version: 1.0' + 'Content-Type: text/plain; charset=UTF-8' + 'X-MMS-IM-Format: ' if self.fontname is not None else '' if self.effects else '' if self.color else '' + 'CS=%(charset)d; PF=%(family)d',
  334.             '',
  335.             '%(body)s'])
  336.         return (s % vars(self)).encode('utf-8')
  337.  
  338.     
  339.     def from_net(cls, rfc822msg):
  340.         m = rfc822msg
  341.         fmt = m.get('X-MMS-IM-Format', '')
  342.         body = m.body().decode('fuzzy utf-8')
  343.         msg = cls(body)
  344.         if fmt:
  345.             fmt = msn.util.mime_to_dict(fmt)
  346.             
  347.             _g = lambda k: get(fmt, k, None)
  348.             fontname = _g('FN')
  349.             msg.fontname = (None,) if fontname is None else fontname.decode('url').decode('utf-8')
  350.             color = _g('CO')
  351.             effects = _g('EF')
  352.             charset = _g('CS')
  353.             family = _g('PF')
  354.             ralign = _g('RL')
  355.             if color is not None:
  356.                 
  357.                 try:
  358.                     color = int(msn.util.bgr_to_rgb(color), 16)
  359.                 except ValueError:
  360.                     color = None
  361.  
  362.                 r = (color & 16711680) >> 16
  363.                 g = (color & 65280) >> 8
  364.                 b = color & 255
  365.                 msg.color = (r, g, b)
  366.                 msg.r = r
  367.                 msg.g = g
  368.                 msg.b = b
  369.             
  370.             if charset is not None:
  371.                 msg.charset = int(charset, 16)
  372.             
  373.             if family is not None:
  374.                 msg.family = int(family)
  375.             
  376.             if ralign is not None:
  377.                 msg.rightalign = bool(int(ralign))
  378.             
  379.             if effects is not None:
  380.                 
  381.                 ef = lambda x: x in effects
  382.                 msg.bold = ef('B')
  383.                 msg.italic = ef('I')
  384.                 msg.underline = ef('U')
  385.                 msg.strike = ef('S')
  386.                 msg.effects = effects
  387.             
  388.         
  389.         return msg
  390.  
  391.     from_net = classmethod(from_net)
  392.     
  393.     def html(self):
  394.         if self._MSNTextMessage__html:
  395.             return self._MSNTextMessage__html
  396.         
  397.         tag = tag
  398.         import util
  399.         t = tag(u'font')
  400.         if self.fontname:
  401.             t[u'face'] = self.fontname
  402.         
  403.         if self.color:
  404.             t[u'color'] = u'#' + u''.join(map((lambda x: if not x:
  405. pass'%02x' % 0), self.color[:3]))
  406.         
  407.         if self.rightalign:
  408.             t[u'align'] = u'right'
  409.         
  410.         innermost = top = t
  411.         for attr in ('bold', 'italic', 'underline', 'strike'):
  412.             if getattr(self, attr):
  413.                 _tag = tag(attr[0])
  414.                 innermost += _tag
  415.                 innermost = _tag
  416.                 continue
  417.         
  418.         innermost._cdata = self.body
  419.         self._MSNTextMessage__html = top._to_xml(pretty = False).strip()
  420.         return self._MSNTextMessage__html
  421.  
  422.  
  423.